//package com.info.zhiduoduo.pay.sdk.dayspaysdk.service;
//
//import com.alibaba.druid.support.json.JSONUtils;
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.google.common.collect.Maps;
//import com.info.zhiduoduo.common.configs.DaysPayConfig;
//import com.info.zhiduoduo.common.utils.CaFileUtil;
//import com.info.zhiduoduo.common.utils.StringUtil;
//import com.info.zhiduoduo.pay.sdk.dayspaysdk.config.Config;
//import com.info.zhiduoduo.pay.sdk.dayspaysdk.core.client.http.Httper;
//import com.info.zhiduoduo.pay.sdk.dayspaysdk.model.pay.request.PayReqDTO;
//import com.info.zhiduoduo.pay.sdk.dayspaysdk.model.pay.request.QueryMerchantBalanceReqDTO;
//import com.info.zhiduoduo.pay.sdk.dayspaysdk.model.pay.request.QueryPayReqDTO;
//import com.info.zhiduoduo.pay.sdk.dayspaysdk.model.pay.response.PayResDTO;
//import com.info.zhiduoduo.pay.sdk.dayspaysdk.model.pay.response.QueryMerchantBalanceResDTO;
//import com.info.zhiduoduo.pay.sdk.dayspaysdk.model.pay.response.QueryPayResDTO;
//import com.info.zhiduoduo.pay.sdk.dayspaysdk.util.SecurityUtil;
//import com.info.zhiduoduo.repository.entity.pay.PaymentMerchant;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.util.HashMap;
//import java.util.Map;
//
//import javax.annotation.PostConstruct;
//
//import lombok.extern.slf4j.Slf4j;
//
//@Slf4j
//@Service
//public class DaysPayApiService {
//
//	@Autowired
//	DaysPayConfig daysPayConfig;
//
//	/** 商户私钥 */
//	private String merchantPrivateKey;
//
//	/** 商户公钥 */
//	private String merchantPublicKey;
//
//	@PostConstruct
//	public void init() {
//		try {
//			Map<String, String> map = CaFileUtil.loadKeyByFile(daysPayConfig.getCaFile(), daysPayConfig.getCaFilePwd());
//			merchantPrivateKey = map.get(CaFileUtil.PRIVATE_KEY);
//			merchantPublicKey = map.get(CaFileUtil.PUBLIC_KEY);
//		} catch (Exception e) {
//			log.error("初始化得仕支付私钥报错", e);
//		}
//	}
//
//	public PayResDTO agentPay(PayReqDTO payReqDTO, PaymentMerchant paymentMerchant) {
//		try {
//			HashMap<String, String> map = transfer2Map(payReqDTO);
//			String sign = SecurityUtil.sign(map, Config.reqSignFields, paymentMerchant.getCaFile(), paymentMerchant.getCaPassword());
//			map.put("signMsg", sign);
//			log.info("请求map：" + JSON.toJSONString(map));
//			String request = SecurityUtil.encrypt(JSON.toJSONString(map), daysPayConfig.getServerPublicKey());
//			log.info("代付req参数:" + request);
//			String tmp = Httper.sendAndGet(new String[]{daysPayConfig.getAgentPayUrl()}, 3, 60, request);
//			log.info("接口请求返回结果:" + tmp);
//			if (StringUtil.isEmpty(tmp)) return null;
//
//			try {
//				HashMap<String, String> response = SecurityUtil.parseResponse(tmp, Config.resSignFields, paymentMerchant.getCaFile(),
//						paymentMerchant.getCaPassword(), daysPayConfig.getServerPublicKey());
//
//				String result = JSONUtils.toJSONString(response);
//				log.info("结果解密后:{}", result);
//				return JSON.parseObject(result, PayResDTO.class);
//			} catch (Exception e) {
//				log.error("返回结果验签失败, 支付失败了, 尝试直接使用json解析返回结果,", e);
//				return JSON.parseObject(tmp, PayResDTO.class);
//			}
//		} catch (Exception e) {
//			log.error("代付报错", e);
//		}
//		return null;
//	}
//
//	public QueryPayResDTO queryAgentPay(QueryPayReqDTO queryPayReqDTO, PaymentMerchant paymentMerchant) {
//		try {
//			HashMap<String, String> map = transfer2Map(queryPayReqDTO);
//			String sign = SecurityUtil.sign(map, Config.reqSignFields, paymentMerchant.getCaFile(), paymentMerchant.getCaPassword());
//			map.put("signMsg", sign);
//
//			String request = SecurityUtil.encrypt(JSON.toJSONString(map), daysPayConfig.getServerPublicKey());
//			log.info("代付结果查询,req参数:" + request);
//			String tmp = Httper.sendAndGet(new String[]{daysPayConfig.getAgentPayUrl()}, 3, 60, request);
//			log.info("接口请求返回结果:" + tmp);
//			if (StringUtil.isEmpty(tmp)) return null;
//
//			try {
//				HashMap<String, String> response = SecurityUtil.parseResponse(tmp, Config.resSignFields, paymentMerchant.getCaFile(),
//						paymentMerchant.getCaPassword(), daysPayConfig.getServerPublicKey());
//
//				String result = JSON.toJSONString(response);
//				log.info("结果解密后:{}", result);
//				return JSON.parseObject(result, QueryPayResDTO.class);
//			} catch (Exception e) {
//				log.error("返回结果验签失败, 支付失败了, 尝试直接使用json解析返回结果,", e);
//				return JSON.parseObject(tmp, QueryPayResDTO.class);
//			}
//		} catch (Exception e) {
//			log.error("代付结果查询报错", e);
//		}
//		return null;
//	}
//
//	public QueryMerchantBalanceResDTO queryMerchantBalance(QueryMerchantBalanceReqDTO reqDTO, PaymentMerchant paymentMerchant) {
//		try {
//			HashMap<String, String> map = transfer2Map(reqDTO);
//			String sign = SecurityUtil.sign(map, Config.reqSignFields, paymentMerchant.getCaFile(), paymentMerchant.getCaPassword());
//			map.put("signMsg", sign);
//
//			String request = SecurityUtil.encrypt(JSON.toJSONString(map), daysPayConfig.getServerPublicKey());
//			log.info("代付结果查询,req参数:" + request);
//			String tmp = Httper.sendAndGet(new String[]{daysPayConfig.getQueryUrl()}, 3, 60, request);
//			log.info("接口请求返回结果:" + tmp);
//			if (StringUtil.isEmpty(tmp)) return null;
//
//			try {
//				HashMap<String, String> response = SecurityUtil.parseResponse(tmp, Config.resSignFields, paymentMerchant.getCaFile(),
//						paymentMerchant.getCaPassword(), daysPayConfig.getServerPublicKey());
//
//				String result = JSON.toJSONString(response);
//				log.info("结果解密后:{}", result);
//				return JSON.parseObject(result, QueryMerchantBalanceResDTO.class);
//			} catch (Exception e) {
//				log.error("返回结果验签失败, 支付失败了, 尝试直接使用json解析返回结果,", e);
//				return JSON.parseObject(tmp, QueryMerchantBalanceResDTO.class);
//			}
//		} catch (Exception e) {
//			log.error("代付结果查询报错", e);
//		}
//		return null;
//	}
//
//	private HashMap<String, String> transfer2Map(Object reqDTO) {
//		HashMap<String, String> map = Maps.newHashMap();
//		JSONObject jo = (JSONObject) JSONObject.toJSON(reqDTO);
//		jo.forEach((k, v) -> {
//			if (v != null) {
//				map.put(k, String.valueOf(v));
//			}
//		});
//		return map;
//	}
//}
